package com.example.thread;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * Semaphore 是 synchronized 的加强版，作用是控制线程的并发数量
 */
public class SemaphoreTest {
    private static Semaphore semphore = new Semaphore(5);

    public static void main(String[] args) throws InterruptedException {
    //    Semaphore semaphore = new Semaphore(int permits)
    //　　isFair 的意思就是，是否公平，获得锁的顺序与线程启动顺序有关，就是公平，先启动的线程，先获得锁。isFair 不能100% 保证公平，只能是大概率公平。
    //　　isFair 为 true，则表示公平，先启动的线程先获得锁。
    // Semaphore semaphore = new Semaphore(int permits , boolean isFair)

        semphore.acquire();
        semphore.release();

        // Semaphore 对象中的当前可用许可数
        int count = semphore.availablePermits();
        // 方法可获取并返回立即可用的所有许可（通路）个数，并将可用许可置为0。
        semphore.drainPermits();
        // 获取等待许可的线程个数。
        semphore.getQueueLength();
        // 判断有没有线程在等待这个许可。
        semphore.hasQueuedThreads();

        // tryAcquire 方法，是 acquire 的扩展版，tryAcquire 作用是尝试得获取通路，如果未传参数，就是尝试获取一个通路，如果传了参数，就是尝试获取 permits 个 通路 、在指定时间 timeout  内 尝试 获取 permits 个通路。
        semphore.tryAcquire();
        semphore.tryAcquire(2);
        semphore.tryAcquire(2, 1000, TimeUnit.SECONDS);
    }

}
